package com.crawljax.core.configuration;
import org.apache.commons.lang3.tuple.Pair;
import com.crawljax.condition.browserwaiter.WaitCondition;
import com.crawljax.condition.crawlcondition.CrawlCondition;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;
public class PreCrawlConfiguration {
public static class PreCrawlConfigurationBuilder {
private final PreCrawlConfiguration preCrawlConfiguration;
private final ImmutableList.Builder<WaitCondition> waitConditions = ImmutableList
.builder();
private final ImmutableList.Builder<CrawlCondition> crawlConditions = ImmutableList
.builder();
private final ImmutableSortedSet.Builder<String> filterAttributeNames =
ImmutableSortedSet.naturalOrder();
private PreCrawlConfigurationBuilder() {
preCrawlConfiguration = new PreCrawlConfiguration();
}
/**
* @param condition
* add a {@link WaitCondition}.
*/
public PreCrawlConfigurationBuilder addWaitCondition(WaitCondition... condition) {
waitConditions.add(condition);
return this;
}
/**
* @param condition
* Add a {@link CrawlCondition}.
*/
public PreCrawlConfigurationBuilder addCrawlCondition(CrawlCondition... condition) {
crawlConditions.add(condition);
return this;
}
/**
* @param names
* Names of attributes that should be ignored. Default is
* <code>"closure_hashcode_(\\w)*"</code> and <code>"jquery[0-9]+"</code> if none
* are specified.
*/
public PreCrawlConfigurationBuilder filterAttributeNames(String names) {
filterAttributeNames.add(names);
return this;
}
PreCrawlConfiguration build(CrawlActionsBuilder crawlActionsBuilder) {
Pair<ImmutableList<CrawlElement>, ImmutableList<CrawlElement>> elements =
crawlActionsBuilder.build();
preCrawlConfiguration.includedElements = elements.getLeft();
preCrawlConfiguration.excludedElements = elements.getRight();
preCrawlConfiguration.waitConditions = waitConditions.build();
preCrawlConfiguration.crawlConditions = crawlConditions.build();
preCrawlConfiguration.filterAttributeNames = filterAttributeNames.build();
if (preCrawlConfiguration.filterAttributeNames.isEmpty()) {
preCrawlConfiguration.filterAttributeNames =
ImmutableSortedSet.of("closure_hashcode_(\\w)*", "jquery[0-9]+");
}
return preCrawlConfiguration;
}
}
public static PreCrawlConfigurationBuilder builder() {
return new PreCrawlConfigurationBuilder();
}
private ImmutableList<WaitCondition> waitConditions;
private ImmutableList<CrawlCondition> crawlConditions;
private ImmutableList<CrawlElement> includedElements;
private ImmutableList<CrawlElement> excludedElements;
private ImmutableSortedSet<String> filterAttributeNames;
private PreCrawlConfiguration() {
}
public ImmutableList<WaitCondition> getWaitConditions() {
return waitConditions;
}
public ImmutableList<CrawlCondition> getCrawlConditions() {
return crawlConditions;
}
public ImmutableList<CrawlElement> getIncludedElements() {
return includedElements;
}
public ImmutableList<CrawlElement> getExcludedElements() {
return excludedElements;
}
public ImmutableSortedSet<String> getFilterAttributeNames() {
return filterAttributeNames;
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("waitConditions", waitConditions)
.add("crawlConditions", crawlConditions)
.add("includedElements", includedElements)
.add("excludedElements", excludedElements)
.add("filterAttributeNames", filterAttributeNames)
.toString();
}
@Override
public int hashCode() {
return Objects.hashCode(waitConditions, crawlConditions, includedElements,
excludedElements, filterAttributeNames);
}
@Override
public boolean equals(Object object) {
if (object instanceof PreCrawlConfiguration) {
PreCrawlConfiguration that = (PreCrawlConfiguration) object;
return Objects.equal(this.waitConditions, that.waitConditions)
&& Objects.equal(this.crawlConditions, that.crawlConditions)
&& Objects.equal(this.includedElements, that.includedElements)
&& Objects.equal(this.excludedElements, that.excludedElements)
&& Objects.equal(this.filterAttributeNames, that.filterAttributeNames);
}
return false;
}
}